package com.bbva.itradecomex.controller;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.apache.log4j.Logger;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.jsf.FacesContextUtils;

import com.bbva.itradecomex.bo.iface.TableroFiaBO;
import com.bbva.itradecomex.domain.FiaProximoVenc;
import com.bbva.itradecomex.util.Constantes;
import com.bbva.itradecomex.util.ITradexUtil;
import com.bbva.itradecomex.util.MessageProvider;
import com.thoughtworks.xstream.XStream;

@Controller
@RequestScoped
@ManagedBean
public class FiaProximoVencController {
	
	private static final Logger log = Logger.getLogger(FiaProximoVencController.class);
	
	private static final XStream XSTREAM = new XStream();
	
	@Autowired
	private TableroFiaBO tableroFiaBO;
	
	private TreeNode rootImp;
	private TreeNode rootExp;
	
	private FiaProximoVenc footerImp;
	private FiaProximoVenc footerExp;
	private FiaProximoVenc footerTotalImpExp;

	public void cargarArbolData(){
		try {
			FacesContext context = FacesContext.getCurrentInstance();
			FiaVencidoController fiaVencidoController = (FiaVencidoController)FacesContextUtils
										.getWebApplicationContext(context).getBean("fiaVencidoController");
			fiaVencidoController.inicializarValores();
			inicializarValores();
			
			cargarTreeFiaProximoVencImp();
			cargarTreeFiaProximoVencExp();
			
			setFooterTotalImpExp();
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	
	private void cargarTreeFiaProximoVencImp(){
		try {
			List<FiaProximoVenc> listFiaProximoVencImp = tableroFiaBO.getListFiaProximoVencImp();
			rootImp = iniciarCrearTreeNode(listFiaProximoVencImp, 0);
			updateTreeNode(rootImp);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	
	private void cargarTreeFiaProximoVencExp(){
		try {
			List<FiaProximoVenc> listFiaProximoVencExp = tableroFiaBO.getListFiaProximoVencExp();
			rootExp = iniciarCrearTreeNode(listFiaProximoVencExp, 1);
			updateTreeNode(rootExp);
		} catch (Exception e) {
			e.printStackTrace();
			log.error(e.getMessage(),e);
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
					MessageProvider.getInstance().getValue("MSG_ERROR_TITLE_GENERAL"),
					MessageProvider.getInstance().getValue("MSG_ERROR_DESCRIP_GENERAL")));
		}
	}
	
	private TreeNode iniciarCrearTreeNode(List<FiaProximoVenc> listFiaProximoVenc, int tipo) throws Exception{
		TreeNode rootTree = crearTreeNode(listFiaProximoVenc);
		if(rootTree != null && rootTree.getChildCount() > 0){
			ITradexUtil.configInitialTreeNode(rootTree, false);
			switch(tipo){
				case 0: setFooterImpExp(listFiaProximoVenc, footerImp); break;  
				case 1: setFooterImpExp(listFiaProximoVenc, footerExp); break;
			}
		}
		return rootTree;
	}
	
	private TreeNode crearTreeNode(List<FiaProximoVenc> list) throws Exception {
		
		TreeNode root = null;
		
		if(list != null){
			root = new DefaultTreeNode(Constantes.TREE_ROOT, null);
			if(list.size() > 0){
				TreeNode treeNode;
		        for (int i = 0; i < list.size(); i++) {
		        	FiaProximoVenc fiaProximoVenc = list.get(i);
		            
		            if (fiaProximoVenc.getCodClasePadre() == null) {
		            	FiaProximoVenc fiaProximoVencTree = new FiaProximoVenc();		            	
		            	fiaProximoVencTree.setDescClase(fiaProximoVenc.getDescClase());
		            	fiaProximoVencTree.setRango1Oper(fiaProximoVenc.getRango1Oper());
		            	fiaProximoVencTree.setRango1Monto(fiaProximoVenc.getRango1Monto());
		            	fiaProximoVencTree.setRango2Oper(fiaProximoVenc.getRango2Oper());
		            	fiaProximoVencTree.setRango2Monto(fiaProximoVenc.getRango2Monto());
		            	fiaProximoVencTree.setRango3Oper(fiaProximoVenc.getRango3Oper());
		            	fiaProximoVencTree.setRango3Monto(fiaProximoVenc.getRango3Monto());
		            	fiaProximoVencTree.setRango4Oper(fiaProximoVenc.getRango4Oper());
		            	fiaProximoVencTree.setRango4Monto(fiaProximoVenc.getRango4Monto());
		            	fiaProximoVencTree.setRango5Oper(fiaProximoVenc.getRango5Oper());
		            	fiaProximoVencTree.setRango5Monto(fiaProximoVenc.getRango5Monto());
		            	fiaProximoVencTree.setRango6Oper(fiaProximoVenc.getRango6Oper());
		            	fiaProximoVencTree.setRango6Monto(fiaProximoVenc.getRango6Monto());
		            	fiaProximoVencTree.setRango7Oper(fiaProximoVenc.getRango7Oper());
		            	fiaProximoVencTree.setRango7Monto(fiaProximoVenc.getRango7Monto());
		            	fiaProximoVencTree.setRango8Oper(fiaProximoVenc.getRango8Oper());
		            	fiaProximoVencTree.setRango8Monto(fiaProximoVenc.getRango8Monto());
		            	fiaProximoVencTree.setRango9Oper(fiaProximoVenc.getRango9Oper());
		            	fiaProximoVencTree.setRango9Monto(fiaProximoVenc.getRango9Monto());
		            	fiaProximoVencTree.setRango10Oper(fiaProximoVenc.getRango10Oper());
		            	fiaProximoVencTree.setRango10Monto(fiaProximoVenc.getRango10Monto());
		                
		                treeNode = new DefaultTreeNode(fiaProximoVencTree, root);
		                
		                adicionaHijos(fiaProximoVenc, treeNode, list);
		            } else {
		            	break;
		            }
		        }
			}
		}
		
        return root;
    }

    private void adicionaHijos(FiaProximoVenc fiaProximoVenc, TreeNode treeNode, List<FiaProximoVenc> list)
    		 throws Exception{
    	for (int i = 0; i < list.size(); i++) {
    		FiaProximoVenc drFiaProximoVenc = list.get(i);
 
            if (fiaProximoVenc.getCodClase().equals(drFiaProximoVenc.getCodClasePadre())){
            	FiaProximoVenc fiaProximoVencTree = new FiaProximoVenc();
            	fiaProximoVencTree.setDescClase(drFiaProximoVenc.getDescClase());
            	fiaProximoVencTree.setRango1Oper(drFiaProximoVenc.getRango1Oper());
            	fiaProximoVencTree.setRango1Monto(drFiaProximoVenc.getRango1Monto());
            	fiaProximoVencTree.setRango2Oper(drFiaProximoVenc.getRango2Oper());
            	fiaProximoVencTree.setRango2Monto(drFiaProximoVenc.getRango2Monto());
            	fiaProximoVencTree.setRango3Oper(drFiaProximoVenc.getRango3Oper());
            	fiaProximoVencTree.setRango3Monto(drFiaProximoVenc.getRango3Monto());
            	fiaProximoVencTree.setRango4Oper(drFiaProximoVenc.getRango4Oper());
            	fiaProximoVencTree.setRango4Monto(drFiaProximoVenc.getRango4Monto());
            	fiaProximoVencTree.setRango5Oper(drFiaProximoVenc.getRango5Oper());
            	fiaProximoVencTree.setRango5Monto(drFiaProximoVenc.getRango5Monto());
            	fiaProximoVencTree.setRango6Oper(drFiaProximoVenc.getRango6Oper());
            	fiaProximoVencTree.setRango6Monto(drFiaProximoVenc.getRango6Monto());
            	fiaProximoVencTree.setRango7Oper(drFiaProximoVenc.getRango7Oper());
            	fiaProximoVencTree.setRango7Monto(drFiaProximoVenc.getRango7Monto());
            	fiaProximoVencTree.setRango8Oper(drFiaProximoVenc.getRango8Oper());
            	fiaProximoVencTree.setRango8Monto(drFiaProximoVenc.getRango8Monto());
            	fiaProximoVencTree.setRango9Oper(drFiaProximoVenc.getRango9Oper());
            	fiaProximoVencTree.setRango9Monto(drFiaProximoVenc.getRango9Monto());
            	fiaProximoVencTree.setRango10Oper(drFiaProximoVenc.getRango10Oper());
            	fiaProximoVencTree.setRango10Monto(drFiaProximoVenc.getRango10Monto());
            	
            	TreeNode drTreeNode = new DefaultTreeNode(fiaProximoVencTree, treeNode);
            	
                adicionaHijos(drFiaProximoVenc, drTreeNode, list);
            }
        }
    }
    
	private void updateTreeNode(TreeNode treeNode) {
		if (treeNode != null) {
			List<TreeNode> listTreeNode = treeNode.getChildren();

			for (int i = 0; i < listTreeNode.size(); i++) {
				TreeNode nodeHijo = listTreeNode.get(i);

				if(nodeHijo.getChildren().size() == 0){
					updateNode(nodeHijo);
					break;
				}

				updateTreeNode(nodeHijo);
			}
		}
	}
	
	private void updateNode(TreeNode nodeHijo) {
		if(nodeHijo.getParent() != null && !Constantes.TREE_ROOT.equals(nodeHijo.getParent().getData())){
			TreeNode nodePadre = nodeHijo.getParent();
			List<TreeNode> listTreeNode = nodePadre.getChildren();
			
			BigDecimal totalRango1Oper =  new BigDecimal(0);
    		BigDecimal totalRango1MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango2Oper =  new BigDecimal(0);
    		BigDecimal totalRango2MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango3Oper =  new BigDecimal(0);
    		BigDecimal totalRango3MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango4Oper =  new BigDecimal(0);
    		BigDecimal totalRango4MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango5Oper =  new BigDecimal(0);
    		BigDecimal totalRango5MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango6Oper =  new BigDecimal(0);
    		BigDecimal totalRango6MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango7Oper =  new BigDecimal(0);
    		BigDecimal totalRango7MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango8Oper =  new BigDecimal(0);
    		BigDecimal totalRango8MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango9Oper =  new BigDecimal(0);
    		BigDecimal totalRango9MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango10Oper =  new BigDecimal(0);
    		BigDecimal totalRango10MontoUDS =  new BigDecimal(0);
			
			for (int i = 0; i < listTreeNode.size(); i++) {
				TreeNode node = listTreeNode.get(i);
				FiaProximoVenc ob = (FiaProximoVenc)node.getData();
				totalRango1Oper =     ITradexUtil.addBigDecimal(totalRango1Oper, ob.getRango1Oper());
    			totalRango1MontoUDS = ITradexUtil.addBigDecimal(totalRango1MontoUDS, ob.getRango1Monto());
    			totalRango2Oper =     ITradexUtil.addBigDecimal(totalRango2Oper, ob.getRango2Oper());
    			totalRango2MontoUDS = ITradexUtil.addBigDecimal(totalRango2MontoUDS, ob.getRango2Monto());
    			totalRango3Oper =     ITradexUtil.addBigDecimal(totalRango3Oper, ob.getRango3Oper());
    			totalRango3MontoUDS = ITradexUtil.addBigDecimal(totalRango3MontoUDS, ob.getRango3Monto());
    			totalRango4Oper =     ITradexUtil.addBigDecimal(totalRango4Oper, ob.getRango4Oper());
    			totalRango4MontoUDS = ITradexUtil.addBigDecimal(totalRango4MontoUDS, ob.getRango4Monto());
    			totalRango5Oper =     ITradexUtil.addBigDecimal(totalRango5Oper, ob.getRango5Oper());
    			totalRango5MontoUDS = ITradexUtil.addBigDecimal(totalRango5MontoUDS, ob.getRango5Monto());
    			totalRango6Oper =     ITradexUtil.addBigDecimal(totalRango6Oper, ob.getRango6Oper());
    			totalRango6MontoUDS = ITradexUtil.addBigDecimal(totalRango6MontoUDS, ob.getRango6Monto()); 
    			totalRango7Oper =     ITradexUtil.addBigDecimal(totalRango7Oper, ob.getRango7Oper());
    			totalRango7MontoUDS = ITradexUtil.addBigDecimal(totalRango7MontoUDS, ob.getRango7Monto());
    			totalRango8Oper =     ITradexUtil.addBigDecimal(totalRango8Oper, ob.getRango8Oper());
    			totalRango8MontoUDS = ITradexUtil.addBigDecimal(totalRango8MontoUDS, ob.getRango8Monto());
    			totalRango9Oper =     ITradexUtil.addBigDecimal(totalRango9Oper, ob.getRango9Oper());
    			totalRango9MontoUDS = ITradexUtil.addBigDecimal(totalRango9MontoUDS, ob.getRango9Monto());
    			totalRango10Oper =    ITradexUtil.addBigDecimal(totalRango10Oper, ob.getRango10Oper());
    			totalRango10MontoUDS =ITradexUtil.addBigDecimal(totalRango10MontoUDS, ob.getRango10Monto());
			}

			((FiaProximoVenc)nodePadre.getData()).setRango1Oper(totalRango1Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango1Monto(totalRango1MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango2Oper(totalRango2Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango2Monto(totalRango2MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango3Oper(totalRango3Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango3Monto(totalRango3MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango4Oper(totalRango4Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango4Monto(totalRango4MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango5Oper(totalRango5Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango5Monto(totalRango5MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango6Oper(totalRango6Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango6Monto(totalRango6MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango7Oper(totalRango7Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango7Monto(totalRango7MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango8Oper(totalRango8Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango8Monto(totalRango8MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango9Oper(totalRango9Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango9Monto(totalRango9MontoUDS);
    		((FiaProximoVenc)nodePadre.getData()).setRango10Oper(totalRango10Oper);
    		((FiaProximoVenc)nodePadre.getData()).setRango10Monto(totalRango10MontoUDS);

			updateNode(nodePadre);
		}
	}
    
    private void setFooterImpExp(List<FiaProximoVenc> listFiaProximoVencImpExp, FiaProximoVenc footerImpExp){
    	if(listFiaProximoVencImpExp != null){
    		BigDecimal totalRango1Oper =  new BigDecimal(0);
    		BigDecimal totalRango1MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango2Oper =  new BigDecimal(0);
    		BigDecimal totalRango2MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango3Oper =  new BigDecimal(0);
    		BigDecimal totalRango3MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango4Oper =  new BigDecimal(0);
    		BigDecimal totalRango4MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango5Oper =  new BigDecimal(0);
    		BigDecimal totalRango5MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango6Oper =  new BigDecimal(0);
    		BigDecimal totalRango6MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango7Oper =  new BigDecimal(0);
    		BigDecimal totalRango7MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango8Oper =  new BigDecimal(0);
    		BigDecimal totalRango8MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango9Oper =  new BigDecimal(0);
    		BigDecimal totalRango9MontoUDS =  new BigDecimal(0);
    		BigDecimal totalRango10Oper =  new BigDecimal(0);
    		BigDecimal totalRango10MontoUDS =  new BigDecimal(0);
    		
    		for(FiaProximoVenc ob : listFiaProximoVencImpExp){
    			totalRango1Oper =     ITradexUtil.addBigDecimal(totalRango1Oper, ob.getRango1Oper());
    			totalRango1MontoUDS = ITradexUtil.addBigDecimal(totalRango1MontoUDS, ob.getRango1Monto());
    			totalRango2Oper =     ITradexUtil.addBigDecimal(totalRango2Oper, ob.getRango2Oper());
    			totalRango2MontoUDS = ITradexUtil.addBigDecimal(totalRango2MontoUDS, ob.getRango2Monto());
    			totalRango3Oper =     ITradexUtil.addBigDecimal(totalRango3Oper, ob.getRango3Oper());
    			totalRango3MontoUDS = ITradexUtil.addBigDecimal(totalRango3MontoUDS, ob.getRango3Monto());
    			totalRango4Oper =     ITradexUtil.addBigDecimal(totalRango4Oper, ob.getRango4Oper());
    			totalRango4MontoUDS = ITradexUtil.addBigDecimal(totalRango4MontoUDS, ob.getRango4Monto());
    			totalRango5Oper =     ITradexUtil.addBigDecimal(totalRango5Oper, ob.getRango5Oper());
    			totalRango5MontoUDS = ITradexUtil.addBigDecimal(totalRango5MontoUDS, ob.getRango5Monto());
    			totalRango6Oper =     ITradexUtil.addBigDecimal(totalRango6Oper, ob.getRango6Oper());
    			totalRango6MontoUDS = ITradexUtil.addBigDecimal(totalRango6MontoUDS, ob.getRango6Monto()); 
    			totalRango7Oper =     ITradexUtil.addBigDecimal(totalRango7Oper, ob.getRango7Oper());
    			totalRango7MontoUDS = ITradexUtil.addBigDecimal(totalRango7MontoUDS, ob.getRango7Monto());
    			totalRango8Oper =     ITradexUtil.addBigDecimal(totalRango8Oper, ob.getRango8Oper());
    			totalRango8MontoUDS = ITradexUtil.addBigDecimal(totalRango8MontoUDS, ob.getRango8Monto());
    			totalRango9Oper =     ITradexUtil.addBigDecimal(totalRango9Oper, ob.getRango9Oper());
    			totalRango9MontoUDS = ITradexUtil.addBigDecimal(totalRango9MontoUDS, ob.getRango9Monto());
    			totalRango10Oper =    ITradexUtil.addBigDecimal(totalRango10Oper, ob.getRango10Oper());
    			totalRango10MontoUDS =ITradexUtil.addBigDecimal(totalRango10MontoUDS, ob.getRango10Monto());
    		}
    		
    		footerImpExp.setRango1Oper(totalRango1Oper);
    		footerImpExp.setRango1Monto(totalRango1MontoUDS);
    		footerImpExp.setRango2Oper(totalRango2Oper);
    		footerImpExp.setRango2Monto(totalRango2MontoUDS);
    		footerImpExp.setRango3Oper(totalRango3Oper);
    		footerImpExp.setRango3Monto(totalRango3MontoUDS);
    		footerImpExp.setRango4Oper(totalRango4Oper);
    		footerImpExp.setRango4Monto(totalRango4MontoUDS);
    		footerImpExp.setRango5Oper(totalRango5Oper);
    		footerImpExp.setRango5Monto(totalRango5MontoUDS);
    		footerImpExp.setRango6Oper(totalRango6Oper);
    		footerImpExp.setRango6Monto(totalRango6MontoUDS);
    		footerImpExp.setRango7Oper(totalRango7Oper);
    		footerImpExp.setRango7Monto(totalRango7MontoUDS);
    		footerImpExp.setRango8Oper(totalRango8Oper);
    		footerImpExp.setRango8Monto(totalRango8MontoUDS);
    		footerImpExp.setRango9Oper(totalRango9Oper);
    		footerImpExp.setRango9Monto(totalRango9MontoUDS);
    		footerImpExp.setRango10Oper(totalRango10Oper);
    		footerImpExp.setRango10Monto(totalRango10MontoUDS);
    	}
	}
	
	private void setFooterTotalImpExp(){
		footerTotalImpExp.setRango1Oper(ITradexUtil.addBigDecimal(footerImp.getRango1Oper(), footerExp.getRango1Oper()));
		footerTotalImpExp.setRango1Monto(ITradexUtil.addBigDecimal(footerImp.getRango1Monto(), footerExp.getRango1Monto()));
		footerTotalImpExp.setRango2Oper(ITradexUtil.addBigDecimal(footerImp.getRango2Oper(), footerExp.getRango2Oper()));
		footerTotalImpExp.setRango2Monto(ITradexUtil.addBigDecimal(footerImp.getRango2Monto(), footerExp.getRango2Monto()));
		footerTotalImpExp.setRango3Oper(ITradexUtil.addBigDecimal(footerImp.getRango3Oper(), footerExp.getRango3Oper()));
		footerTotalImpExp.setRango3Monto(ITradexUtil.addBigDecimal(footerImp.getRango3Monto(), footerExp.getRango3Monto()));
		footerTotalImpExp.setRango4Oper(ITradexUtil.addBigDecimal(footerImp.getRango4Oper(), footerExp.getRango4Oper()));
		footerTotalImpExp.setRango4Monto(ITradexUtil.addBigDecimal(footerImp.getRango4Monto(), footerExp.getRango4Monto()));
		footerTotalImpExp.setRango5Oper(ITradexUtil.addBigDecimal(footerImp.getRango5Oper(), footerExp.getRango5Oper()));
		footerTotalImpExp.setRango5Monto(ITradexUtil.addBigDecimal(footerImp.getRango5Monto(), footerExp.getRango5Monto()));
		footerTotalImpExp.setRango6Oper(ITradexUtil.addBigDecimal(footerImp.getRango6Oper(), footerExp.getRango6Oper()));
		footerTotalImpExp.setRango6Monto(ITradexUtil.addBigDecimal(footerImp.getRango6Monto(), footerExp.getRango6Monto())); 
		footerTotalImpExp.setRango7Oper(ITradexUtil.addBigDecimal(footerImp.getRango7Oper(), footerExp.getRango7Oper()));
		footerTotalImpExp.setRango7Monto(ITradexUtil.addBigDecimal(footerImp.getRango7Monto(), footerExp.getRango7Monto()));
		footerTotalImpExp.setRango8Oper(ITradexUtil.addBigDecimal(footerImp.getRango8Oper(), footerExp.getRango8Oper()));
		footerTotalImpExp.setRango8Monto(ITradexUtil.addBigDecimal(footerImp.getRango8Monto(), footerExp.getRango8Monto()));
		footerTotalImpExp.setRango9Oper(ITradexUtil.addBigDecimal(footerImp.getRango9Oper(), footerExp.getRango9Oper()));
		footerTotalImpExp.setRango9Monto(ITradexUtil.addBigDecimal(footerImp.getRango9Monto(), footerExp.getRango9Monto()));
		footerTotalImpExp.setRango10Oper(ITradexUtil.addBigDecimal(footerImp.getRango10Oper(), footerExp.getRango10Oper()));
		footerTotalImpExp.setRango10Monto(ITradexUtil.addBigDecimal(footerImp.getRango10Monto(), footerExp.getRango10Monto()));
	}
	
	public void exportDocument(String tipoDoc){
		if((rootImp != null && rootImp.getChildCount() > 0) ||
				   (rootExp != null && rootExp.getChildCount() > 0)){
			List<FiaProximoVenc> listFiaProximoVencImp = new ArrayList<FiaProximoVenc>();
			buildTreeNodeToListReport(rootImp, listFiaProximoVencImp, "");
			
			List<FiaProximoVenc> listFiaProximoVencExp = new ArrayList<FiaProximoVenc>();
			buildTreeNodeToListReport(rootExp, listFiaProximoVencExp, "");
			
			Map<String,Object> parametros = new HashMap<String, Object>();
			parametros.put("listFiaProximoVencImp",listFiaProximoVencImp);
			parametros.put("listFiaProximoVencExp",listFiaProximoVencExp);
			parametros.put("obFooterImp",footerImp);
			parametros.put("obFooterExp",footerExp);
			parametros.put("obFooterImpExp",footerTotalImpExp);
			Date mydate = new Date();
			//parametros.put("dateReport", mydate);
			
			String nombreFile = "FIA_PROX_VENCIMIENTOS_"+ITradexUtil.convertUtilDateToString(mydate, Constantes.FORMAT_DATE_MM_DD_yyyy);
			
			if(Constantes.ARCHIVO_EXCEL.equals(tipoDoc)){
				ITradexUtil.exportXLSJasperEmptyDS(parametros, "/xmlReport/FiaProxVencimientos/FiaProxVencimiento_excel.jasper", nombreFile);
			}else if(Constantes.ARCHIVO_PDF.contentEquals(tipoDoc)){
				ITradexUtil.exportPDFEmptyDS(parametros, "/xmlReport/FiaProxVencimientos/FiaProxVencimiento.jasper", nombreFile);
			}
		}
	}
	
	private void buildTreeNodeToListReport(TreeNode node, List<FiaProximoVenc> listFiaProximoVenc, String espacio){
		List<TreeNode> list = node.getChildren();
		boolean continuar = true;
		for(int i=0; i<list.size(); i++){
			TreeNode tnode = list.get(i);
			if(Constantes.TREE_ROOT.equals(node.getData())){
				espacio= "  ";
			}else{
				if(i == 0){
					espacio = espacio + "      ";
				}
			}
			
			if(tnode.getChildren().size() == 0){
				continuar = false;
			}
			
			FiaProximoVenc fiaProximoVenc = (FiaProximoVenc)XSTREAM.fromXML(
					XSTREAM.toXML((FiaProximoVenc)tnode.getData()));
			
			fiaProximoVenc.setDescClase(espacio + fiaProximoVenc.getDescClase());
			listFiaProximoVenc.add(fiaProximoVenc);
			
			if(continuar){
				buildTreeNodeToListReport(tnode, listFiaProximoVenc, espacio);
			}
		}
	}
	
	public void inicializarValores(){
		initBodyTree();
		initFooter();
	}
	
	private void initBodyTree(){
		this.rootImp = null;
		this.rootExp = null;
	}
	
	private void initFooter(){
		footerImp = new FiaProximoVenc();
		footerExp = new FiaProximoVenc();
		footerTotalImpExp = new FiaProximoVenc();
	}

	public TreeNode getRootImp() {
		return rootImp;
	}

	public void setRootImp(TreeNode rootImp) {
		this.rootImp = rootImp;
	}

	public TreeNode getRootExp() {
		return rootExp;
	}

	public void setRootExp(TreeNode rootExp) {
		this.rootExp = rootExp;
	}

	public FiaProximoVenc getFooterImp() {
		return footerImp;
	}

	public void setFooterImp(FiaProximoVenc footerImp) {
		this.footerImp = footerImp;
	}

	public FiaProximoVenc getFooterExp() {
		return footerExp;
	}

	public void setFooterExp(FiaProximoVenc footerExp) {
		this.footerExp = footerExp;
	}

	public FiaProximoVenc getFooterTotalImpExp() {
		return footerTotalImpExp;
	}

	public void setFooterTotalImpExp(FiaProximoVenc footerTotalImpExp) {
		this.footerTotalImpExp = footerTotalImpExp;
	}
}
